home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d931.lha / Modules / TimerDevice / TimerDevice.mod / TimerDevice.mod
Text File  |  1993-12-20  |  10KB  |  414 lines

  1. IMPLEMENTATION MODULE TimerDevice;
  2.  
  3. (* Die Anleitungen und Erläuterungen befinden sich im Definitionsfile    *)
  4. (* Compiler M2Amiga V4.097d                  © 1991 by Andre Wiethoff    *)
  5.  
  6.  
  7. (*$ StackChk:=FALSE *)
  8. (*$ RangeChk:=FALSE *)
  9. (*$ OverflowChk:=FALSE *)
  10. (*$ NilChk:=FALSE *)
  11. (*$ CaseChk:=FALSE *)
  12. (*$ ReturnChk:=FALSE *)
  13. (*$ Volatile:=FALSE *)
  14. (*$ LargeVars:=FALSE *)
  15.  
  16.  
  17. FROM SYSTEM     IMPORT ADR,LONGSET,ASSEMBLE;
  18. FROM ExecD      IMPORT MsgPortPtr,TaskPtr,MsgPort,IOStdReq,DevicePtr;
  19. FROM ExecL      IMPORT OpenDevice,AddPort,FindTask,RemPort,CloseDevice,DoIO;
  20. FROM Timer    IMPORT timerName,TimeRequest,TimeVal,addRequest,getSysTime,
  21.                        setSysTime;
  22.  
  23.  
  24. CONST daysPerLeapYear    = 366;
  25.       daysPerYear        = 365;
  26.       daysPerWeek        = 7;
  27.       hoursPerDay        = 24;
  28.       minutesPerHour     = 60;
  29.       secondsPerMinute   = 60;
  30.       secondsPerHour     = minutesPerHour*secondsPerMinute;
  31.       secondsPerDay      = hoursPerDay*secondsPerHour;
  32.       secondsPerYear     = daysPerYear*secondsPerDay;
  33.       secondsPerLeapYear = daysPerLeapYear*secondsPerDay;
  34.  
  35.  
  36. TYPE ControlD    = (hold,busy,irq,adj);
  37.      ControlDSet = SET OF ControlD;
  38.      ControlE    = (mask,itrp,t0,t1);
  39.      ControlESet = SET OF ControlE;
  40.      ControlF    = (reset,stop,t12,test);
  41.      ControlFSet = SET OF ControlF;
  42.  
  43.      RealClock = RECORD
  44.        timeDate : ARRAY[0..12] OF LONGCARD;
  45.        pad1     : ARRAY[0..2] OF [0..255];
  46.        cd       : ControlDSet;
  47.        pad2     : ARRAY[0..2] OF [0..255];
  48.        ce       : ControlESet;
  49.        pad3     : ARRAY[0..2] OF [0..255];
  50.        cf       : ControlFSet;
  51.      END;
  52.  
  53. VAR
  54.   task        : TaskPtr;
  55.   msgPort     : MsgPort;
  56.   timeReq     : TimeRequest;
  57.   opened      : BOOLEAN;
  58.   daysOfMonth : POINTER TO ARRAY[0..11] OF LONGCARD;
  59.  
  60.  
  61. (*$ EntryExitCode:=FALSE *)
  62. PROCEDURE Year;
  63. BEGIN
  64.   ASSEMBLE(
  65.     DC.L 31,28,31,30,31,30,31,31,30,31,30,31
  66.   END);
  67. END Year;
  68.  
  69. (*$ EntryExitCode:=FALSE *)
  70. PROCEDURE LeapYear;
  71. BEGIN
  72.   ASSEMBLE(
  73.     DC.L 31,29,31,30,31,30,31,31,30,31,30,31
  74.   END);
  75. END LeapYear;
  76.  
  77.  
  78.  
  79. PROCEDURE OpenTimer(timer : CARDINAL) : DevicePtr;
  80. BEGIN
  81.   IF opened THEN
  82.     CloseTimer;
  83.   END;
  84.  
  85.   IF timer#0 THEN
  86.     timer:=1;
  87.   END;
  88.   task:=FindTask(0);
  89.   msgPort.sigTask:=task;
  90.   AddPort(ADR(msgPort));
  91.   OpenDevice(ADR(timerName),timer,ADR(timeReq),LONGSET{});
  92.  
  93.   IF (timeReq.node.device#NIL) AND (timeReq.node.error=0) THEN
  94.     timeReq.node.message.replyPort:=ADR(msgPort);
  95.     opened:=TRUE;
  96.   ELSE
  97.     RemPort(ADR(msgPort));
  98.   END;
  99.   IF opened THEN
  100.     RETURN timeReq.node.device;
  101.   ELSE
  102.     RETURN NIL;
  103.   END;
  104. END OpenTimer;
  105.  
  106.  
  107.  
  108. PROCEDURE WaitSecs(seconds,micros : LONGCARD);
  109. BEGIN
  110.   IF opened THEN
  111.     timeReq.time.secs:=seconds;
  112.     timeReq.time.micro:=micros;
  113.     timeReq.node.command:=addRequest;
  114.     DoIO(ADR(timeReq));
  115.   END;
  116. END WaitSecs;
  117.  
  118.  
  119.  
  120. PROCEDURE GetSystemTime(VAR timeVal : TimeVal);
  121. BEGIN
  122.   IF opened THEN
  123.     timeReq.node.command:=getSysTime;
  124.     DoIO(ADR(timeReq));
  125.     timeVal:=timeReq.time;
  126.   END;
  127. END GetSystemTime;
  128.  
  129.  
  130.  
  131. PROCEDURE SetSystemTime(timeVal : TimeVal);
  132. BEGIN
  133.   IF opened THEN
  134.     timeReq.node.command:=setSysTime;
  135.     timeReq.time:=timeVal;
  136.     DoIO(ADR(timeReq));
  137.   END;
  138. END SetSystemTime;
  139.  
  140.  
  141.  
  142. PROCEDURE MakeTimeList(timeVal      : TimeVal;
  143.                VAR timeList : TimeList);
  144. VAR n,t,q,qo:LONGCARD;
  145. BEGIN
  146.   n:=(timeVal.secs DIV secondsPerDay);
  147.   t:=1978;
  148.  
  149.   IF ((t MOD 4=0) AND (t MOD 100#0)) OR (t MOD 400=0) THEN
  150.     q:=daysPerLeapYear;
  151.   ELSE
  152.     q:=daysPerYear;
  153.   END;
  154.   WHILE n>=q DO
  155.     DEC(n,q); INC(t);
  156.     IF ((t MOD 4=0) AND (t MOD 100#0)) OR (t MOD 400=0) THEN
  157.       q:=daysPerLeapYear;
  158.     ELSE
  159.       q:=daysPerYear;
  160.     END;
  161.   END;
  162.  
  163.   WITH timeList DO
  164.     year:=t; t:=0;
  165.  
  166.     IF q=daysPerLeapYear THEN
  167.       daysOfMonth:=ADR(LeapYear);
  168.     ELSE
  169.       daysOfMonth:=ADR(Year);
  170.     END;
  171.  
  172.     WHILE n>=daysOfMonth^[t] DO DEC(n,daysOfMonth^[t]); INC(t); END;
  173.  
  174.     month:=t+1;
  175.     day:=n+1;
  176.     hour:=(timeVal.secs DIV secondsPerHour) MOD hoursPerDay;
  177.     minute:=(timeVal.secs DIV secondsPerMinute) MOD minutesPerHour;
  178.     second:=timeVal.secs MOD secondsPerMinute;
  179.     week:=(timeVal.secs DIV secondsPerDay) DIV daysPerWeek;
  180.     dayOfWeek:=(timeVal.secs DIV secondsPerDay) MOD daysPerWeek;
  181.   END;
  182. END MakeTimeList;
  183.  
  184.  
  185.  
  186. PROCEDURE MakeTimeVal(timeList    : TimeList;
  187.               VAR timeVal : TimeVal) : BOOLEAN;
  188. VAR n,t : LONGCARD;
  189.     ok  : BOOLEAN;
  190.  
  191. BEGIN
  192.   ok:=TRUE; n:=0;
  193.   IF timeList.second<secondsPerMinute THEN
  194.     INC(n,timeList.second);
  195.   ELSE
  196.     INC(n,(timeList.second MOD secondsPerMinute));
  197.     ok:=FALSE;
  198.   END;
  199.   IF timeList.minute<secondsPerMinute THEN
  200.     INC(n,timeList.minute*secondsPerMinute);
  201.   ELSE
  202.     INC(n,(timeList.minute MOD minutesPerHour)*secondsPerMinute);
  203.     ok:=FALSE;
  204.   END;
  205.   IF timeList.hour<hoursPerDay THEN
  206.     INC(n,timeList.hour*secondsPerHour);
  207.   ELSE
  208.     INC(n,(timeList.hour MOD hoursPerDay)*secondsPerHour);
  209.     ok:=FALSE;
  210.   END;
  211.  
  212.   IF ((timeList.year MOD 4=0) AND (timeList.year MOD 100#0)) OR
  213.   (timeList.year MOD 400=0) THEN
  214.     daysOfMonth:=ADR(LeapYear);
  215.   ELSE
  216.     daysOfMonth:=ADR(Year);
  217.   END;
  218.   IF (timeList.month<13) AND (timeList.month>0) THEN
  219.     FOR t:=1 TO timeList.month-1 DO
  220.       INC(n,daysOfMonth^[t-1]*secondsPerDay);
  221.     END;
  222.   ELSE
  223.     ok:=FALSE;
  224.   END;
  225.   IF (timeList.month>0) AND (timeList.month<13) THEN
  226.     IF (timeList.day<=daysOfMonth^[timeList.month-1]) AND (timeList.day>0) THEN
  227.       INC(n,(timeList.day-1)*secondsPerDay);
  228.     ELSE
  229.       ok:=FALSE;
  230.     END;
  231.   END;
  232.   IF (timeList.year>1977) AND (timeList.year<2114) THEN
  233.     FOR t:=1978 TO timeList.year-1 DO
  234.       IF ((t MOD 4=0) AND (t MOD 100#0)) OR (t MOD 400=0) THEN
  235.         INC(n,secondsPerLeapYear);
  236.       ELSE
  237.         INC(n,secondsPerYear);
  238.       END;
  239.     END;
  240.   ELSE
  241.     ok:=FALSE;
  242.   END;
  243.   timeVal.secs:=n;
  244.   timeVal.micro:=0;
  245.   RETURN ok;
  246. END MakeTimeVal;
  247.  
  248.  
  249.  
  250. PROCEDURE GetDaysOfMonth(year,month : LONGCARD) : LONGCARD;
  251. BEGIN
  252.   IF (month>0) AND (month<13) AND (year>1600) AND (year<2114) THEN
  253.     IF month=2 THEN
  254.       IF ((year MOD 4=0) AND (year MOD 100#0)) OR (year MOD 400=0) THEN
  255.         daysOfMonth:=ADR(LeapYear);
  256.       ELSE
  257.         daysOfMonth:=ADR(Year);
  258.       END;
  259.     END;
  260.     RETURN daysOfMonth^[month-1];
  261.   ELSE
  262.     RETURN 0;
  263.   END;
  264. END GetDaysOfMonth;
  265.  
  266.  
  267.  
  268. PROCEDURE CloseTimer;
  269. BEGIN
  270.   IF opened THEN
  271.     RemPort(ADR(msgPort));
  272.     CloseDevice(ADR(timeReq));
  273.     opened:=FALSE;
  274.   END;
  275. END CloseTimer;
  276.  
  277.  
  278.  
  279. VAR realClock          : POINTER TO RealClock;
  280.     oldA2000[0D80000H] : INTEGER; (* Dummy-Variable *)
  281.         A500[0DC0000H] : INTEGER;
  282.  
  283.  
  284. PROCEDURE BackupClockExistent() : BOOLEAN;
  285.  
  286.   PROCEDURE TestActualClock() : BOOLEAN;
  287.   VAR fl1,fl2 : BOOLEAN;
  288.   BEGIN
  289.     EXCL(realClock^.cd,hold);
  290.     fl1:=(busy IN realClock^.cd);
  291.     INCL(realClock^.cd,hold);
  292.     fl2:=(busy IN realClock^.cd);
  293.     EXCL(realClock^.cd,hold);
  294.     RETURN (fl1#fl2);
  295.   END TestActualClock;
  296.  
  297. VAR return : BOOLEAN;
  298. BEGIN
  299.   return:=TRUE;
  300.   realClock:=ADR(A500);
  301.   IF NOT TestActualClock() THEN
  302.     realClock:=ADR(oldA2000);
  303.     IF NOT TestActualClock() THEN
  304.       return:=FALSE;
  305.     END;
  306.   END;
  307.   RETURN return;
  308. END BackupClockExistent;
  309.  
  310.  
  311.  
  312. PROCEDURE ResetBackupClock;
  313. BEGIN
  314.   INCL(realClock^.cf,reset);
  315.   EXCL(realClock^.cf,reset);
  316. END ResetBackupClock;
  317.  
  318.  
  319.  
  320. PROCEDURE StopBackupClock;
  321. BEGIN
  322.   INCL(realClock^.cf,stop);
  323. END StopBackupClock;
  324.  
  325.  
  326.  
  327. PROCEDURE StartBackupClock;
  328. BEGIN
  329.   EXCL(realClock^.cf,stop);
  330. END StartBackupClock;
  331.  
  332.  
  333.  
  334. PROCEDURE GetBackupClock(VAR timeList : TimeList);
  335. VAR t,n : LONGCARD;
  336. BEGIN
  337.   WITH realClock^ DO
  338.     INCL(cd,hold);
  339.     WHILE busy IN cd DO END;
  340.     timeList.second:=(timeDate[0] MOD 16)+(timeDate[1] MOD 8)*10;
  341.     timeList.minute:=(timeDate[2] MOD 16)+(timeDate[3] MOD 8)*10;
  342.     timeList.hour:=(timeDate[4] MOD 16)+(timeDate[5] MOD 4)*10;
  343.     timeList.day:=(timeDate[6] MOD 16)+(timeDate[7] MOD 4)*10;
  344.     timeList.month:=(timeDate[8] MOD 16)+(timeDate[9] MOD 2)*10;
  345.     timeList.year:=(timeDate[10] MOD 16)+(timeDate[11] MOD 16)*10;
  346.     INC(timeList.year,1900);
  347.     EXCL(cd,hold);
  348.     n:=0;
  349.     IF ((timeList.year MOD 4=0) AND (timeList.year MOD 100#0)) OR
  350.     (timeList.year MOD 400=0) THEN
  351.       daysOfMonth:=ADR(LeapYear);
  352.     ELSE
  353.       daysOfMonth:=ADR(Year);
  354.     END;
  355.     IF (timeList.month<13) AND (timeList.month>0) THEN
  356.       FOR t:=1 TO timeList.month-1 DO
  357.         INC(n,daysOfMonth^[t-1]*secondsPerDay);
  358.       END;
  359.     END;
  360.     IF (timeList.month>0) AND (timeList.month<13) THEN
  361.       IF (timeList.day<=daysOfMonth^[timeList.month-1]) AND (timeList.day>0)
  362.       THEN INC(n,(timeList.day-1)*secondsPerDay);
  363.       END;
  364.     END;
  365.     IF (timeList.year>1977) AND (timeList.year<2114) THEN
  366.       FOR t:=1978 TO timeList.year-1 DO
  367.         IF ((t MOD 4=0) AND (t MOD 100#0)) OR (t MOD 400=0) THEN
  368.           INC(n,secondsPerLeapYear);
  369.         ELSE
  370.           INC(n,secondsPerYear);
  371.         END;
  372.       END;
  373.     END;
  374.     timeList.week:=(n DIV secondsPerDay) DIV daysPerWeek;
  375.     timeList.dayOfWeek:=(n DIV secondsPerDay) MOD daysPerWeek;
  376.   END;
  377. END GetBackupClock;
  378.  
  379.  
  380.  
  381. PROCEDURE SetBackupClock(timeList : TimeList);
  382.   PROCEDURE Set(value     : LONGCARD;
  383.                 VAR c1,c2 : LONGCARD);
  384.   BEGIN
  385.     c1:=((c1 DIV 16)*16)+(value MOD 10);
  386.     c2:=((c2 DIV 16)*16)+((value DIV 10) MOD 10);
  387.   END Set;
  388. VAR lc : LONGCARD;
  389. BEGIN
  390.   WITH realClock^ DO
  391.     INCL(cd,hold);
  392.     WHILE busy IN cd DO END;
  393.     Set(timeList.second,timeDate[0],timeDate[1]);
  394.     Set(timeList.minute,timeDate[2],timeDate[3]);
  395.     Set(timeList.hour,timeDate[4],timeDate[5]);
  396.     Set(timeList.day,timeDate[6],timeDate[7]);
  397.     Set(timeList.month,timeDate[8],timeDate[9]);
  398.     Set(timeList.year-1900,timeDate[10],timeDate[11]);
  399.     EXCL(cd,hold);
  400.   END;
  401. END SetBackupClock;
  402.  
  403.  
  404. BEGIN
  405.  
  406.   opened:=FALSE;
  407.   realClock:=ADR(A500);
  408.  
  409. CLOSE
  410.  
  411.   CloseTimer;
  412.  
  413. END TimerDevice.
  414.